﻿namespace Lesson9_顺序存储和链式存储;
//多个相关的变量包成一个整体进行使用
class Program
{
    static void Main(string[] args)
    {
        LinkedList<int> list = new LinkedList<int>();
        
        list.Add(1);
        list.Add(2);
        list.Add(3);
        list.Add(4);

        LinkedNode<int> node = list.head;
        while (node != null)
        {
            Console.WriteLine(node.value);
            node = node.nextnode;
        }
    }

    #region 单链表的实现

    #region 节点

    /// <summary>
    ///  用来表示节点的类
    /// </summary>
    /// <typeparam name="T"></typeparam>

    class LinkedNode<T>
    {
        public T value;
        public LinkedNode<T> node;
        public LinkedNode<T> nextnode;

        public LinkedNode(T value)
        {
            this.value = value;
        }
    }

    #endregion

    #region 链表

    /// <summary>
    /// 链表类，用来管理节点 增加，删除等操作
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class LinkedList<T>
    {
        public LinkedNode<T> head;
        public LinkedNode<T> tail;

        public void Add(T value)
        {
            LinkedNode<T> node = new LinkedNode<T>(value);
            if (head == null)
            {
                head = node;
                tail = node;
            }
            else
            {
                tail.nextnode = node;
                tail = node; //这意味着下一次添加节点时，会继续在当前尾部追加，保持tail始终指向链表的最后一个元素。
            }
        }

        public void Remove(T value)
        {
            if (head == null)
            {
                return;
            }

            if (head.value.Equals(value)) //移除的是首个元素
            {
                head = head.nextnode;
                if (head == null)
                {

                    tail = null;
                }

                return;
            }

            LinkedNode<T> node = head; //实例的head字段（即链表的头节点）赋值给这个node变量。这样做通常是为了遍历链表或操作链表的节点
            while (head.nextnode != null)
            {
                if (node.nextnode.value.Equals(value))
                {
                    node.nextnode = node.nextnode.nextnode;
                }

                node = node.nextnode;

            }
        }
    }
}



#endregion


#endregion